home *** CD-ROM | disk | FTP | other *** search
/ Otherware / Otherware_1_SB_Development.iso / mac / developm / language / macberon.sit / MacOberon 2.4(0) / TickCounter.Mod (.txt) < prev    next >
Encoding:
Oberon Text  |  1991-10-17  |  3.9 KB  |  101 lines

  1. Syntax10.Scn.Fnt
  2. MODULE TickCounter;    (* Michael Franz, 10.10.91 *)
  3.         Installs a Task that will update a tick count which is displayed centered
  4.         in a viewer.  Oberon Tasks even run in the background under MultiFinder
  5.         but are activated less often.
  6.             The tick count may be exported to the caret position by the usual
  7.         CopyOver control-option combination.
  8.             Great for demo purposes - the larger the font chosen, the better the
  9.         effect.
  10.         Position the Star Marker in this viewer (Enter on Keypad)
  11.                 Compiler.Compile *
  12.                 TickCounter.Open
  13.     IMPORT
  14.         SYSTEM, Display, Fonts, Oberon, Texts, TextFrames, Viewers, MenuViewers, Input;
  15.     CONST
  16.         Font="Helvetica24.Scn.Fnt";
  17.     TYPE
  18.         TickMsg=RECORD (Display.FrameMsg)    END;
  19.         Frame=POINTER TO FrameDesc;
  20.         FrameDesc=RECORD (Display.FrameDesc) END;
  21.         W: Texts.Writer;
  22.         ticks: LONGINT; countTask: Oberon.Task;
  23.         pat: ARRAY 10 OF LONGINT; dx0, fontH: INTEGER;
  24.     PROCEDURE* Tick;    (* Installed as an Oberon Task *)
  25.         VAR t: LONGINT; M: TickMsg;
  26.     BEGIN    SYSTEM.GET(16AH, t);
  27.         IF    t#ticks    THEN    ticks:=t; Viewers.Broadcast(M)    END
  28.     END Tick;
  29.     PROCEDURE UpdateCounter(F: Frame);    (* Update Tick Count in Frame F *)
  30.         VAR i: INTEGER; n: LONGINT; a: ARRAY 10 OF INTEGER; ch, X, Y: INTEGER;
  31.     BEGIN
  32.         IF    F.H > fontH    THEN    i:=0; n:=ticks;
  33.             REPEAT    a[i]:=SHORT(n MOD 10); n:=n DIV 10; INC(i)    UNTIL    n=0;
  34.             X:=F.X+(F.W-i*dx0) DIV 2; Y:=F.Y+(F.H-fontH) DIV 2;
  35.             REPEAT    DEC(i); ch:=a[i]; Display.CopyPattern(Display.white, pat[ch], X, Y, Display.replace); INC(X, dx0)    UNTIL    i=0;
  36.         END
  37.     END UpdateCounter;
  38.     PROCEDURE Export;    (* Copy Counter to Caret *)
  39.         VAR M: Oberon.CopyOverMsg;
  40.     BEGIN    Texts.WriteInt(W, ticks, 8); M.text:=TextFrames.Text(""); Texts.Append(M.text, W.buf);
  41.         M.beg:=0; M.end:=M.text.len; Oberon.FocusViewer.handle(Oberon.FocusViewer, M)
  42.     END Export;
  43.     PROCEDURE Handle*(F: Display.Frame; VAR M: Display.FrameMsg);
  44.         VAR keysum: SET; F1: Frame;
  45.     BEGIN
  46.         WITH    F: Frame    DO
  47.             IF    M IS TickMsg    THEN    UpdateCounter(F)
  48.             ELSIF    M IS Oberon.InputMsg    THEN
  49.                 WITH    M: Oberon.InputMsg    DO
  50.                     IF    M.id = Oberon.track    THEN
  51.                         IF    (M.X >= F.X) & (M.X < F.X+F.W) & (F.Y <= M.Y)    THEN    keysum:=M.keys;
  52.                             Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, M.X, M.Y);
  53.                             WHILE    M.keys # {}    DO    Input.Mouse(M.keys, M.X, M.Y); keysum:=keysum+M.keys;
  54.                                 Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, M.X, M.Y)
  55.                             END;
  56.                             IF    keysum={0, 1}    THEN    Export    END
  57.                         END
  58.                     END
  59.                 END
  60.             ELSIF    M IS Oberon.ControlMsg    THEN
  61.                 WITH    M: Oberon.ControlMsg    DO
  62.                     IF    M.id = Oberon.mark    THEN    Oberon.DrawCursor(Oberon.Pointer, Oberon.Star, M.X, M.Y)    END
  63.                 END
  64.             ELSIF    M IS Oberon.CopyMsg    THEN
  65.                 WITH    M: Oberon.CopyMsg    DO    NEW(F1); F1^:=F^; M.F:=F1    END
  66.             ELSIF    M IS MenuViewers.ModifyMsg    THEN
  67.                 WITH    M: MenuViewers.ModifyMsg    DO    F.H:=M.H; F.Y:=M.Y;
  68.                     IF    M.H > 0    THEN    Display.ReplConst(Display.black, F.X, F.Y, F.W, F.H, Display.replace); UpdateCounter(F)    END
  69.                 END
  70.             END
  71.         END
  72.     END Handle;
  73.     PROCEDURE NewCountFrame(): Frame;
  74.         VAR F: Frame;
  75.     BEGIN    NEW(F); F.handle:=Handle; RETURN F
  76.     END NewCountFrame;
  77.     PROCEDURE NewCountTask(VAR T: Oberon.Task);
  78.     BEGIN    NEW(T); T.safe:=FALSE; T.handle:=Tick; Oberon.Install(T)
  79.     END NewCountTask;
  80.     PROCEDURE Open*;
  81.         VAR X, Y: INTEGER; V: Viewers.Viewer;
  82.     BEGIN
  83.         IF    countTask = NIL    THEN    NewCountTask(countTask)    END;
  84.         Oberon.AllocateSystemViewer(Oberon.SystemTrack(0), X, Y);
  85.         V:=MenuViewers.New(
  86.             TextFrames.NewMenu("TickCounter", "System.Close System.Copy System.Grow TickCounter.Stop"),
  87.             NewCountFrame(), TextFrames.menuH, X, Y)
  88.     END Open;
  89.     PROCEDURE Stop*;
  90.     BEGIN    Oberon.Remove(countTask); countTask:=NIL
  91.     END Stop;
  92.     PROCEDURE InitTable;
  93.         VAR fnt: Fonts.Font; i, x, y, w, h, dx: INTEGER;
  94.     BEGIN    fnt:= Fonts.This(Font); i:=9;
  95.         WHILE    i >= 0    DO    Display.GetChar(fnt.raster, CHR(ORD("0")+ i), dx, x, y, w, h, pat[i]); DEC(i)    END;
  96.         dx0:=dx; fontH:=fnt.height
  97.     END InitTable;
  98. BEGIN
  99.     Texts.OpenWriter(W); InitTable; NewCountTask(countTask)
  100. END TickCounter.
  101.